package com.yuand.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;

/**
 * @author yuandong
 * @company KB
 * @create 2022-01-23 9:00
 */
public class JwtUtils {

	protected static final long MILLIS_SECOND = 1000;  //1 s

	protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; // 1 min

	// 默认过期时间(毫秒)
	private static final long EXPIRE_TIME2 = 60 * 60 * 1000 * 24;


	private static final long EXPIRE_TIME = 1 * 60 * 1000;
	// 密钥
	private static final String SECRET = "xzjt@jwt";

	/**
	 * 生成 token
	 * 该方法不设置token的过期时间，过期时间通过redis进行维护
	 * @param username 用户名
	 * @return 加密的token
	 */
	public static  String generate(String username) {
		Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
		Algorithm algorithm = Algorithm.HMAC256(SECRET);
		// 附带username信息
		return JWT.create()
				.withClaim("username", username)
				// 创建一个新的JWT，并使用给定的算法进行标记
				.sign(algorithm);

	}


	/**
	 * 生成 token
	 *
	 * @param username   用户名
	 * @param expireTime 过期时间(毫秒)
	 * @return 加密的token
	 */
	public static String generate(String userId, long expireTime) {
		Date date = new Date(System.currentTimeMillis() + expireTime);
		System.out.println("token过期时间是>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+date);
		Algorithm algorithm = Algorithm.HMAC256(SECRET);
		// 附带username信息
		return JWT.create()
				.withClaim("userId", userId)
				// 到期时间
				.withExpiresAt(date)
				// 创建一个新的JWT，并使用给定的算法进行标记
				.sign(algorithm);

	}


	/**
	 * 校验 token 是否正确
	 *
	 * @param token    密钥
	 * @param username 用户名
	 * @return 是否正确
	 */
	public static   boolean verify(String token, String userId)  {
		try {
			Algorithm algorithm = Algorithm.HMAC256(SECRET);
			// 在token中附带了username信息
			JWTVerifier verifier = JWT.require(algorithm)
					.withClaim("userId", userId)
					.build();
			// 验证 token
			verifier.verify(token);
			return true;
		} catch(Exception e) {
			return false;
		}
	}

	/**
	 * 获得token中的信息，无需secret解密也能获得
	 *
	 * @return token中包含的用户名
	 */
	public static  String getUserId(String token) {
		try {
			DecodedJWT jwt = JWT.decode(token);
			return jwt.getClaim("userId").asString();
		} catch (JWTDecodeException e) {
			return null;
		}
	}
}
